iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 4
0
自我挑戰組

JavaScript核心篇系列 第 5

【JavaScript 核心】函式提升

  • 分享至 

  • xImage
  •  

函式提升 (hoisting)

下面先來說明執行環境是 如何解析程式碼的
例子 1:
var a = 1;
執行環境 分成兩個階段:
1.創造環境:記憶體會先把 a 記起來,此時若去查找 a 會出現 undefined
2.執行:此時才會把 1 這個值賦予給 a
所以順序就是:
創造環境:var a;
執行(賦值): a = 1;

※ 函式陳述式在創造階段就會優先載入 (可以運行)

ho1.jpg

範例 1

var Ming = '小明';
console.log(Ming);

// 拆解
var Ming; // 創造階段:先宣告變數
Ming = '小明'; // 執行:賦予值
console.log(Ming);

範例 2:函式陳述式

callName();
function callName() {
  console.log('呼叫小明');
}

結果為:呼叫小明
函式在創造階段時就已經載入,所以可以正常運行,
像這種 執行函式先 而宣告函式在後,就可以稱為函式提升。

//拆解
//創造階段
function callName() {
  console.log('呼叫小明');
}
//執行
callName();

範例 3:函式表達式

var callName = function(){
  console.log('呼叫小明');
}
callName(); // 呼叫小明

若是callName() 在 表達式之前呼叫

callName(); 
var callName = function(){
  console.log('呼叫小明');
}
// Uncaught TypeError: callName is not a function

讓我們來拆解看看怎麼回事

// 創造階段
var callName; // undefined
// 執行
callName = function(){
  console.log('呼叫小明');
}
// callName 尚在未賦值階段,所以會跳錯

範例 4:陳述式與表達式之誰才是我要呼叫的小明

function callName() {
 console.log('呼叫小明 1');
}
var callName = function () {
 console.log('呼叫小明 2');
}
callName(); 
//呼叫小明 2

此節重點,函式優先

function callName() {
 console.log('呼叫小明 1');
}
var callName;
//執行
callName = function () {
 console.log('呼叫小明 2');
} // 此時會把小明1 給覆蓋過去
callName();
//所以答案是 呼叫小明 2

範例 5

callName();
function callName(){
  console.log(Ming);
}
var Ming = '小明';

// undefined

拆解

// 創造階段
function callName(){
  console.log(Ming);
}
var Ming;
// 執行
callName(); // 此時的 Ming 尚未賦予值 所以是 undefined
Ming = '小明';

小測驗:請試著拆解下面程式碼

whosName();
function whosName(){
  if(name){
    name = '杰倫';
  }
}
var name = '小明';
console.log(name);

x
x
x
x
x
x
x
x
答案是 小明

//創造
function whosName(){
  if(name){
    name = '杰倫';
  }
}
var name;
//執行
whosName(); // 此時 name = undefined
name = '小明'; // 此時 name 被重新賦予值 小明
console.log(name); // 答案為小明

上一篇
【JavaScript 核心】範圍鍊
下一篇
【JavaScript 核心】記憶體 & 同步、非同步
系列文
JavaScript核心篇19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言